package cn.iocoder.yudao.module.dbit.service.jobresumeinfo;


import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.dbit.dal.dataobject.jobinfo.JobInfoDO;
import cn.iocoder.yudao.module.dbit.dal.dataobject.resumeinfo.ResumeInfoDO;
import cn.iocoder.yudao.module.dbit.dal.dataobject.stumst.StuMstDO;
import cn.iocoder.yudao.module.dbit.dal.mysql.jobinfo.JobInfoMapper;
import cn.iocoder.yudao.module.dbit.enums.jobinfo.JobInfoEunums;
import cn.iocoder.yudao.module.dbit.service.resumeinfo.ResumeInfoService;
import cn.iocoder.yudao.module.dbit.service.stumst.StuMstService;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;

import cn.iocoder.yudao.module.dbit.controller.admin.jobresumeinfo.vo.*;
import cn.iocoder.yudao.module.dbit.dal.dataobject.jobresumeinfo.JobResumeInfoDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

import cn.iocoder.yudao.module.dbit.dal.mysql.jobresumeinfo.JobResumeInfoMapper;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;


/**
 * 简历投递 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class JobResumeInfoServiceImpl implements JobResumeInfoService {

    private static final Logger log = LoggerFactory.getLogger(JobResumeInfoServiceImpl.class);
    @Resource
    private JobResumeInfoMapper jobResumeInfoMapper;

    @Resource
    private JobInfoMapper jobInfoMapper;

    @Resource
    private AdminUserService adminUserService;

    @Resource
    private StuMstService stuMstService;

    @Resource
    private ResumeInfoService resumeInfoService;




    @Override
    public Integer createJobResumeInfo(Integer jobId) {

        // TODO 目前查询当前学生上传最新的pdf简历作为默认投递的简历 后续可以进行选择
        JobResumeInfoSaveReqVO createReqVO = new JobResumeInfoSaveReqVO();
        createReqVO.setJobId(jobId);
        //获取当前登录人id
        Long userId = SecurityFrameworkUtils.getLoginUserId();
        Integer uid = userId != null ? userId.intValue() : 0;
        createReqVO.setResumeUserId(uid);
        //查询最新简历进行投递
        ResumeInfoDO resumeInfoDO = resumeInfoService.getResumeInfoByUserId(uid);
        if (resumeInfoDO == null){
            return null;
        }
        //设置最新简历id
        createReqVO.setResumeId(resumeInfoDO.getId());
        JobResumeInfoDO jobResumeInfoDO = cn.iocoder.yudao.framework.common.util.object.BeanUtils.toBean(createReqVO, JobResumeInfoDO.class);
        return jobResumeInfoMapper.insert(jobResumeInfoDO);
    }

    @Override
    public void updateJobResumeInfo(JobResumeInfoSaveReqVO updateReqVO) {

    }

    @Override
    public void deleteJobResumeInfo(Integer id) {

    }

    private void validateJobResumeInfoExists(Integer id) {

    }

    @Override
    public JobResumeInfoDO getJobResumeInfo(Integer id) {
        return jobResumeInfoMapper.selectById(id);
    }

    @Override
    @TenantIgnore
    public PageResult<JobResumeInfoRespVO> getJobResumeInfoPage(JobResumeInfoPageReqVO pageReqVO) {
        // 获取当前用户发布的职位id列表
        List<Integer> jobIds = jobInfoMapper.selectList(new LambdaQueryWrapper<JobInfoDO>()
                        .eq(JobInfoDO::getCreator, SecurityFrameworkUtils.getLoginUserId())
                        .eq(JobInfoDO::getJobStatus, JobInfoEunums.JOB_STATUS_PUBLIC.getCode()))
                .stream()
                .map(JobInfoDO::getJobId)
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(jobIds)) {
            return new PageResult<JobResumeInfoRespVO>();
        }
        IPage<JobResumeInfoDO> p = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
        IPage<JobResumeInfoDO> list = jobResumeInfoMapper.getList(p, pageReqVO, jobIds);
        log.info("当前信息{}", list.getRecords());
        PageResult<JobResumeInfoDO> page = new PageResult<>(list.getRecords(), list.getTotal());
        // PageResult<JobResumeInfoDO> page = jobResumeInfoMapper.selectPage(pageReqVO, jobIds);
        List<JobResumeInfoDO> JobResumeInfoList = page.getList();
        List<JobResumeInfoRespVO> resultList = new ArrayList<>();
        // 处理JobResumeInfoList集合，完成resultList生成
        JobResumeInfoList.forEach(jobResumeInfo -> {
            JobResumeInfoRespVO vo = new JobResumeInfoRespVO();
            // 获取投递者id
            Long resumeUserId = Long.valueOf(jobResumeInfo.getResumeUserId());
            // 获取投递者信息（性别+头像）
            AdminUserDO user = adminUserService.getUser(resumeUserId);
            vo.setSex(user.getSex());
            vo.setAvatar(user.getAvatar());
            // 获取投递者信息（姓名+学历+毕业年份+毕业院校）
            StuMstDO student = stuMstService.getStuMst(resumeUserId);
            if (student != null) {
                BeanUtils.copyProperties(student, vo);
            }
            // 获取投递信息(id+简历投递时间)
            vo.setId(jobResumeInfo.getId());
            vo.setCreateTime(jobResumeInfo.getCreateTime());
            vo.setJobResumeStatus(jobResumeInfo.getJobResumeStatus());
            // 获取职位名称
            vo.setJobName(jobInfoMapper.selectById(jobResumeInfo.getJobId()).getJobName());
            // 获取投递者简历URL
            vo.setResumePath(resumeInfoService.getResumeInfo(jobResumeInfo.getResumeId()).getResumePath());
            resultList.add(vo);
        });
        // 返回处理好的分页对象
        return new PageResult<JobResumeInfoRespVO>(resultList, page.getTotal());
    }

    @Override
    public void updateJobResumeInfoStatus(Integer id, Integer status) {
        // 将id的状态更新为status
        jobResumeInfoMapper.updateJobResumeInfoStatus(id, status);
    }

    @Override
    @TenantIgnore
    public PageResult<StudentJobResumeInfoRespVO> getStudentDeliveryRecord(JobResumeInfoPageReqVO pageReqVO) {
        // 通过学生用户id或获取对应的投递记录分页信息
        PageResult<JobResumeInfoDO> resumeInfoPageResult = jobResumeInfoMapper.selectStudentPage(pageReqVO);
        // 获取投递记录集合
        List<JobResumeInfoDO> resumeInfoPageList = resumeInfoPageResult.getList();
        // 创建StudentJobResumeInfoRespVO集合
        ArrayList<StudentJobResumeInfoRespVO> resultList = new ArrayList<>();
        resumeInfoPageList.forEach(resumeInfo -> {
            StudentJobResumeInfoRespVO vo = new StudentJobResumeInfoRespVO();
            vo.setJobResumeStatus(resumeInfo.getJobResumeStatus());
            vo.setCreateTime(resumeInfo.getCreateTime());
            // 获取对应投递的职位信息
            JobInfoDO jobInfoDO = jobInfoMapper.selectById(resumeInfo.getJobId());
            vo.setJobId(jobInfoDO.getJobId());
            vo.setSalaryMeet(jobInfoDO.getSalaryMeet());
            vo.setJobName(jobInfoDO.getJobName());
            vo.setSalaryRangeFrom(jobInfoDO.getSalaryRangeFrom());
            vo.setSalaryRangeTo(jobInfoDO.getSalaryRangeTo());
            vo.setJobRequireEdu(jobInfoDO.getJobRequireEdu());
            // 获取职位的招聘城市
            List<Integer> cityIds = Arrays.stream(jobInfoDO.getJobCity().split(";"))
                    .map(Integer::parseInt)
                    .collect(Collectors.toList());
            StringBuilder cityNames = new StringBuilder();
            cityIds.forEach(cityId -> {
                cityNames.append(AreaUtils.getArea(cityId).getName()).append(";");
            });
            vo.setJobCity(cityNames.toString());
            // 获取公司信息
            AdminUserDO user = adminUserService.getUser(Long.valueOf(jobInfoDO.getCreator()));
            vo.setAvatar(user.getAvatar());
            vo.setNickName(user.getNickname());
            // 获取投递的简历的url路径
            vo.setResumePath(resumeInfoService.getResumeInfo(resumeInfo.getResumeId()).getResumePath());
            resultList.add(vo);
        });
        return new PageResult<StudentJobResumeInfoRespVO>(resultList, resumeInfoPageResult.getTotal());
    }

}